{
 "cells": [
  {
   "cell_type": "markdown",
   "id": "19095b39-daba-4632-8b23-35b22ab71a8c",
   "metadata": {
    "tags": []
   },
   "source": [
    "# 快速傅里叶变换fft\n",
    "具体要求参考[链接](https://www.wolai.com/zzutai/ne85AbnL15kmZPPJRQ2q4j)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "id": "4e42cc3e-b29d-463d-aa51-5a1dae08a51b",
   "metadata": {
    "tags": []
   },
   "outputs": [
    {
     "data": {
      "image/png": "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diTiDufPn9fRo0clSb/97W81e/ZsTZkyRTU1NWpubtYf/vAH3/fGL3XkyBH9wz/8g2+6pqbG92+32+37bVQAANA3JnJ9eXm5Jk+eLKnr988BhAdPZQdi1COPPKIdO3bozTff1OWXXy7pwvfI3nzzTQ0ePFhf//rX1djY6Fu+c7H8zjvv6Pbbb5cknTp1St/73vf0ox/9SJdffrnuuusuXXnllXrggQcU6NcUJ06cqP/6r//y/V177bW+15YsWaLCwsJwHDIAAHHFRK6vqanR22+/reLiYkkKeC3QGb++DPQdn5gDMaapqUlLlizR1q1b9ctf/lJer1c7duxQTU2NTp48qRMnTig5OVnvv/++5syZox07dig1NVXXX3+97+EtHbejVVVV6e6779ZXvvIVff/739ff/u3fSpJeeukl3XLLLZo2bZr++Z//2a/Q7i75Pvrooz1eFgAAdGUy1y9evFg5OTmaMWOGpAvfP+/4znkgt9xySzjDAcQFPjEHYszzzz+vf/u3f9OZM2d0xx136Bvf+Ib+5V/+Re+9954GDBigGTNm6Nlnn9Xzzz+v3/72t76fNfvyl7/seyqrJK1fv1433nijxo0bp5/97GeSLoy0t7S0aMSIEfqf//kfeTweffnLX9Yrr7ziW6/zaPzRo0e1ZMkSVVRU+P002scff6z7779fb731lgYMGBDmiAAA0L+YyvVtbW1avHix/vVf/1VOp9O3/BVXXKGmpibLv1tuucXvU3sAvcMn5kCM+e53v6svvvhCt99+u2688UalpaVZLnfLLbcoISHBN+J9qfvvv19paWlavHixb15HspYu/KTKrl279O///u/6m7/5G98yHb9tKkkjR47UO++8ozvvvNNvmSuuuELHjh3TxIkTu/2JFQAA4M9krp85c6bfNubNm6c77rhDgwYNstzH7373u5CPD0BXDi/3mgIAAAAAYAy3sgMAAAAAYBCFOQAAAAAABlGYAwAAAABgUEw//K29vV2ffvqpBg8eHPQnHAAAiASv16umpiZdfvnlSkhg7NsO5HoAQLQJR76P6cL8008/VW5urulmAADg55NPPtGoUaNMN6NfINcDAKKVnfk+pgvzwYMHS5KOHz+urKwsw62JHh6PR2+//bZmzJjh+w1KXEBsrBEXa8QlMGJj7fTp08rLy/PlJ/Qdud4a78HAiI014hIY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",
      "text/plain": [
       "<Figure size 1200x500 with 2 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "import numpy as np\n",
    "import matplotlib.pyplot as plt\n",
    "import math\n",
    "\n",
    "# 1. 定义混合波形\n",
    "srate = 3000\n",
    "t = np.linspace(0, 1, srate)\n",
    "s1 = 1.5 * np.sin(-2 * np.pi * 30 * t)\n",
    "s2 = 3 * np.cos(-2 * np.pi * 5 * t)\n",
    "s3 = 10 * np.sin(-2 * np.pi * 100 * t)\n",
    "s4 = 20 * np.cos(-2 * np.pi * 120 * t)\n",
    "m = s1 + s2 + s3 + s4\n",
    "\n",
    "'''\n",
    "#  方法1:  循环算法\n",
    "fcoefs=np.zeros(srate,dtype='complex') \n",
    "# 循环所有可能的频率\n",
    "for f in range(srate):\n",
    "    p=m*np.exp(-1j*2*math.pi*f*t) # 让飞轮旋转时间t\n",
    "    fcoefs[f]=np.sum(p)\n",
    "amp_spec = 2 * np.abs(fcoefs / srate)\n",
    "'''\n",
    "#  方法2: 使用np.fft.fft\n",
    "fcoefs = np.fft.fft(m)\n",
    "amp_spec = 2 * np.abs(fcoefs / srate)\n",
    "\n",
    "freqs = np.fft.fftfreq(len(m), 1 / srate)  # 计算每个傅里叶系数对应的频率\n",
    "amp_spec_smoothed = np.copy(amp_spec)  # 创建一个与原幅值谱形状相同的副本\n",
    "# 低于幅值谱最大值5%的傅里叶系数幅值设为0\n",
    "amp_spec_smoothed[amp_spec < 0.05 * np.max(amp_spec)] = 0\n",
    "amp_spec_smoothed[(np.abs(freqs) > 110)] = 0  # 高于110Hz和的傅里叶系数幅值设为0\n",
    "\n",
    "freq_shifted = np.fft.fftshift(freqs)  # 将频率移到中心\n",
    "amp_shifted = np.fft.fftshift(amp_spec)  # 将幅值移到中心\n",
    "amp_shifted_smoothed = np.fft.fftshift(amp_spec_smoothed)  # 将平滑后的幅值移到中心\n",
    "\n",
    "plt.rcParams['font.family'] = 'SimHei'\n",
    "plt.rcParams['axes.unicode_minus'] = False\n",
    "plt.figure(figsize=(12, 5))\n",
    "plt.subplot(1, 2, 1)\n",
    "plt.stem(freq_shifted, amp_shifted)\n",
    "plt.xlim(-150, 150)\n",
    "plt.grid()  # 显示网格线\n",
    "plt.title('去噪前')\n",
    "\n",
    "plt.subplot(1, 2, 2)\n",
    "plt.stem(freq_shifted, amp_shifted_smoothed)\n",
    "plt.xlim(-150, 150)\n",
    "\n",
    "plt.grid()  # 显示网格线\n",
    "plt.ylim(-1, 21)\n",
    "plt.title('去噪后')\n",
    "plt.show()\n"
   ]
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3 (ipykernel)",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.9.16"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 5
}
